package cn.edu.hwec;

import java.sql.*;
import java.util.*;

public class DBHelper {
    /**
     * 获取数据库连接，这里没有使用连接池
     * @return 连接对象
     * @throws SQLException 连接异常
     */
    private static Connection getConnection() throws SQLException { //连接参数硬编码
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/db",  "root", "12qwas");
    }

    static { //静态代码块完成驱动的加载
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai")); //设置时区
        try {
            Class.forName("com.mysql.cj.jdbc.Driver"); //com.mysql.cj.jdbc.Driver
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * 执行数据库的增删改操作
     * @param sql 要执行的sql指令
     * @param params 需要传递的参数
     * @return 操作受影响的行数
     * @throws SQLException 操作出现的异常
     */
    public static int update(String sql, Object... params) throws SQLException {
        try (Connection cn = getConnection();
             PreparedStatement ps = cn.prepareStatement(sql)) {
            for (int i = 0; i < params.length; i++) { //设置参数
                ps.setObject(i + 1, params[i]);
            }
            return ps.executeUpdate();
        }
    }

    /**
     * 执行数据库的查询操作
     * @param sql 要执行的sql指令
     * @param params 需要传递的参数
     * @return 查询的结果
     * @throws SQLException 操作出现的异常
     */
    public static List<Map<String, Object>> query(String sql, Object... params) throws SQLException{
        //使用try-with-resources自动管理连接、语句、结果集
        try (Connection cn = getConnection();
             PreparedStatement ps = cn.prepareStatement(sql)) {
            for (int i = 0; i < params.length; i++) { //设置参数
                ps.setObject(i + 1, params[i]);
            }
            try (ResultSet rs = ps.executeQuery()) { // 执行查询并获取结果集
                return toList(rs);
            }
        }
    }

    /**
     * 将记录集转换为List
     * @param rs 记录集ResultSet
     * @return 转换后的结果
     * @throws SQLException 操作出现的异常
     */
    private static List<Map<String, Object>> toList(ResultSet rs) throws SQLException {
        List<Map<String, Object>> list = new ArrayList<>();
        ResultSetMetaData md = rs.getMetaData(); //元数据
        int columnCount = md.getColumnCount();
        while (rs.next()) {
            Map<String, Object> row = new HashMap<>();
            for (int i = 1; i <= columnCount; i++) {
                String columnLabel = md.getColumnLabel(i); //获取列别名或列名
                Object value = rs.getObject(columnLabel);
                row.put(columnLabel, value);
            }
            list.add(row);
        }
        return list;
    }

}
